#include "FileHandler.h"

FileHandler::FileHandler(std::string filePath, std::string fileOpenMode) {
    this->_currentFilePosition = 0; // 当前文件指针位置默认在文件起始点
    this->_filePath = filePath;
    // 判断文件是否存在
    if(false == this->_isFileExist()) {
        PrintLine("文件不存在 [%s]", this->_filePath.c_str());
        return;
    }
    PrintLine("文件存在 [%s]", this->_filePath.c_str());
    // 存在，则打开文件
    this->_file = fopen(this->_filePath.c_str(), fileOpenMode.c_str());
    if(NULL == this->_file) {
        PrintLine("文件打开失败 [%s]", this->_filePath.c_str());
        return;
    }
}

bool FileHandler::_isFileExist() {
    // F_OK：判断文件是否存在，存在返回0。此外还有R_OK、W_OK、X_OK用于判定读写可执行权限
    // 注意：判断“文件”是否存在，仅针对普通文件和目录。.、..、套接字文件、软链接等文件也当做它不存在
    return access(this->_filePath.c_str(), F_OK) == 0 && (this->_isDirectoryFile() || this->_isOrdinaryFile());
}

long FileHandler::_getFileSize() {
    if(NULL == this->_file) {
        PrintLine("文件指针为空 [%s]", this->_filePath.c_str());
        return -1;
    }
    fseek(this->_file, 0L, SEEK_END);   // 把文件指针移到文件末尾（和文件末尾偏移是0，也就是直接移动到文件末尾）
    long ret = ftell(this->_file);
    fseek(this->_file, this->_currentFilePosition, SEEK_SET);  // 恢复文件指针原来的位置
    return ret;
}

size_t FileHandler::_readFile(char *buff, int length) {
    size_t ret = fread(buff, sizeof(char), length, this->_file);
    this->_currentFilePosition = ftell(this->_file);
    return ret;
}

bool FileHandler::_isDirectoryFile() {
    struct stat st;
    stat(this->_filePath.c_str(), &st);
    return S_ISDIR(st.st_mode); // 如果mode和S_ISDIR匹配就会返回true
}
bool FileHandler::_isOrdinaryFile() {
    struct stat st;
    stat(this->_filePath.c_str(), &st);
    return S_ISREG(st.st_mode); // 如果mode和S_ISREG匹配就会返回true
}